/**
 * 
 */
package es.ucm.fdi.xtremeaudio.modelo.parser;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;

import es.ucm.fdi.xtremeaudio.modelo.excepciones.ReaderException;

/**
 * 
 * @author
 * 
 */
public class ParserSAXLista extends DefaultHandler {

	/*--------------------------------------------------------------------------
	Lista de ids de canciones resultado de un parseo
	---------------------------------------------------------------------------*/
	private ArrayList<Integer> vIds;

	/*--------------------------------------------------------------------------
	Cancion actualmente leido en un proceso de parseo
	---------------------------------------------------------------------------*/
	private Integer idActual;

	/*--------------------------------------------------------------------------
	Buffer de caracteres de un elemento en un proceso de parseo
	---------------------------------------------------------------------------*/
	private StringBuffer sBuffer = null;

	public ParserSAXLista() {
	}

	public ArrayList<Integer> vParseFile(String filename)
			throws ReaderException {
		vIds = new ArrayList<Integer>();
		try {
			// Obtener una clase SAXParserFactory para obtener un SAXParser
			SAXParserFactory oSAXParserFactory = SAXParserFactory.newInstance();

			// Definimos las opciones de parseo: validar el xml
			oSAXParserFactory.setValidating(true);

			// Definimos las opciones de parseo: namespace no activado
			oSAXParserFactory.setNamespaceAware(false);

			// Obtener una clase SAXParser
			SAXParser oSAXParser = oSAXParserFactory.newSAXParser();

			// Empezar a parsear el archivo con esta clase para recoger los
			// eventos de parseo
			oSAXParser.parse(new File(filename), this);

		} catch (FactoryConfigurationError e) {
			throw new ReaderException(
					"ReaderException[FactoryConfigurationError]: "
							+ e.toString());
		} catch (ParserConfigurationException e) {
			throw new ReaderException(
					"ReaderException[ParserConfigurationException]: "
							+ e.toString());
		} catch (SAXException e) {
			throw new ReaderException("ReaderException[SAXException]: "
					+ e.toString());
		} catch (IOException e) {
			throw new ReaderException("ReaderException[IOException]: "
					+ e.toString());
		}
		return vIds;
	}

	public void warning(SAXParseException e) throws SAXException {
		System.out.println("Warning: ");
		printInfo(e);
	}

	public void error(SAXParseException e) throws SAXException {
		System.out.println("Error: ");
		printInfo(e);
	}

	public void fatalError(SAXParseException e) throws SAXException {
		System.out.println("Fatal error: ");
		printInfo(e);
	}

	private void printInfo(SAXParseException e) {
		System.out.println("\tPublic ID: " + e.getPublicId());
		System.out.println("\tSystem ID: " + e.getSystemId());
		System.out.println("\tN\u00bamero de linea: " + e.getLineNumber());
		System.out.println("\tN\u00bamero de columna: " + e.getColumnNumber());
		System.out.println("\tMensaje: " + e.getMessage() + "\n");
	}

	public void startElement(String namespaceURI, String localName,
			String qualifiedName, Attributes attributes) throws SAXException {
		System.out.println("Elemento:");
		System.out.println("\t->> NamespaceURI: " + namespaceURI);
		System.out.println("\t->> Nombre local: " + localName);
		System.out.println("\t->> Nombre cualificado: " + qualifiedName);
		System.out.println("\t->> Atributos: " + attributes.toString() + "\n");
	}

	public void characters(char buf[], int offset, int len) throws SAXException {
		String s = new String(buf, offset, len);
		if (sBuffer == null)
			sBuffer = new StringBuffer(len);
		sBuffer.append(s.trim());
		System.out.println("\tValor: " + sBuffer + "\n");
	}

	public void endElement(String uri, String localName, String qualifiedName)
			throws SAXException {
		System.out.println("Cierre Elemento:");
		System.out.println("\t->>URI: " + uri);
		System.out.println("\t->>Nombre local: " + localName);
		System.out.println("\t->>Nombre cualificado: " + qualifiedName + "\n");

		if ("".equals(localName))
			localName = qualifiedName;

		if (localName.compareToIgnoreCase("id") == 0) {
			idActual = Integer.parseInt(sBuffer.toString());
			vIds.add(idActual);
		}

		// Limpiamos sBuffer
		sBuffer = null;
	}
}